// 创建库 =>连接库 =>创建表 => 插入数据 => 查删改数据

require('dotenv').config();
const mysql = require('mysql2/promise');
const { nanoid } = require('nanoid');

// 全局连接池变量
let connectionPool = null;

// 初始化数据库
const initDatabase = async () => {
    try {
        // 先连接到默认的服务
        const defaultConnection = await mysql.createConnection({
            host: process.env.DB_HOST,
            user: process.env.DB_USER,
            password: process.env.DB_PASSWORD,
            port: process.env.DB_PORT,
            multipleStatements: true // 允许执行多个SQL语句
        });
        console.log('MySQL数据库服务连接成功');

        // 检查存放ai对话的数据库是否存在，不存在则创建
        await defaultConnection.execute(`CREATE DATABASE IF NOT EXISTS ${process.env.DB_NAME}`);

        console.log(`${process.env.DB_NAME}创建成功或已存在`);

        // 断掉默认的连接
        await defaultConnection.end();

        // 创建连接池
        connectionPool = mysql.createPool({
            host: process.env.DB_HOST,
            user: process.env.DB_USER,
            password: process.env.DB_PASSWORD,
            database: process.env.DB_NAME,
            port: process.env.DB_PORT,
            waitForConnections: true, // 当没有可用连接时，等待
            connectionLimit: 10, // 最大连接数
            queueLimit: 0 // 不限制排队连接数
        });

        // 获取连接来创建表
        const connectionDb = await connectionPool.getConnection();
        console.log(`${process.env.DB_NAME}数据库连接成功`);

        // 创建会话表（如果不存在）
        await connectionDb.query(`  
            CREATE TABLE IF NOT EXISTS chat_sessions(
                sessionId VARCHAR(255) NOT NULL COMMENT '会话ID',
                sessionName TEXT NOT NULL,
                createdTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updatedTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                PRIMARY KEY(sessionId)
            )
        `);

        // 创建消息表（如果不存在）
        await connectionDb.query(`
            CREATE TABLE IF NOT EXISTS chat_messages(
                messageId VARCHAR(255) NOT NULL UNIQUE COMMENT '消息ID',
                sessionId VARCHAR(255) NOT NULL COMMENT '会话ID',
                messageType ENUM('user', 'ai') NOT NULL COMMENT '消息类型',
                content TEXT NOT NULL,
                createdTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updatedTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
            )
        `);

        // 创建上传d文件表（如果不存在）
        await connectionDb.query(`
            CREATE TABLE IF NOT EXISTS uploaded_files(
                fileId VARCHAR(255) NOT NULL UNIQUE COMMENT '文件ID',
                filename TEXT NOT NULL COMMENT '文件名',
                contentType TEXT NOT NULL COMMENT '文件类型',
                fileSize BIGINT NOT NULL COMMENT '文件大小（字节）',
                fileData LONGBLOB NOT NULL COMMENT '文件数据',
                sessionId VARCHAR(255) COMMENT '会话ID',
                createdTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updatedTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
            )
        `);

        // 释放连接
        connectionDb.release();

        return connectionPool;
    } catch (err) {
        console.error('数据库初始化失败:', err);
        throw err;
    }
};

// 获取连接池
const getConnectionPool = async () => {
    if (!connectionPool) {
        connectionPool = await initDatabase();
    }
    return connectionPool;
};



// 保存上传的文件到数据库
const saveFile = async (filename, contentType, fileSize, fileData, sessionId = null, fileId = 'file_' + nanoid(20)) => {
    try {
        const pool = await getConnectionPool();
        const [result] = await pool.execute(
            'INSERT INTO uploaded_files (fileId, filename, contentType, fileSize, fileData, sessionId) VALUES (?, ?, ?, ?, ?, ?)',
            [fileId, filename, contentType, fileSize, fileData, sessionId]
        );
        console.log('文件保存成功', result);
        return { success: true, message: '文件保存成功', data: { fileId } };
    } catch (error) {
        console.error('文件保存失败:', error);
        return { success: false, message: '文件保存失败', error: error.message };
    }
};

// 根据fileId获取文件
const getFile = async (fileId) => {
    try {
        const pool = await getConnectionPool();
        const [rows] = await pool.execute(
            'SELECT filename, contentType, fileSize, fileData FROM uploaded_files WHERE fileId = ?',
            [fileId]
        );
        if (rows.length === 0) {
            return { success: false, message: '文件不存在' };
        }
        return { success: true, message: '文件获取成功', data: rows[0] };
    } catch (error) {
        console.error('文件获取失败:', error);
        return { success: false, message: '文件获取失败', error: error.message };
    }
};



// 初始化连接池
initDatabase().catch(err => {
    console.error('数据库初始化失败:', err);
});

module.exports = {
    saveFile,
    getFile,
};